package com.yingcheng.numerology.framework.bazi.core.util;

public class BaziCalculator {

    // 天干和地支的数组，用于查找对应的干支
    private static final String[] TIAN_GAN = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
    private static final String[] DI_ZHI = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
    
    // 不同年干对应的正月月干起始
    private static final String[][] MONTH_GAN_START = {
        {"甲", "己", "丙"}, // 甲、己年从丙开始
        {"乙", "庚", "戊"}, // 乙、庚年从戊开始
        {"丙", "辛", "庚"}, // 丙、辛年从庚开始
        {"丁", "壬", "壬"}, // 丁、壬年从壬开始
        {"戊", "癸", "甲"}  // 戊、癸年从甲开始
    };

    // 计算月柱的主方法
    public static String calculateMonthPillar(String yearGan, int lunarMonth) {
        // 月干起始点，根据年干判断
        int startGanIndex = getStartGanIndex(yearGan);
        if (startGanIndex == -1) {
            throw new IllegalArgumentException("无效的年干输入：" + yearGan);
        }

        // 月干计算
        int monthGanIndex = (startGanIndex + lunarMonth - 1) % 10;
        String monthGan = TIAN_GAN[monthGanIndex];

        // 月支计算
        String monthZhi = DI_ZHI[(lunarMonth + 1) % 12]; // 正月对应寅

        return monthGan + monthZhi;
    }

    // 根据年干获取正月的起始月干索引
    private static int getStartGanIndex(String yearGan) {
        switch (yearGan) {
            case "甲":
            case "己":
                return getGanIndex("丙");
            case "乙":
            case "庚":
                return getGanIndex("戊");
            case "丙":
            case "辛":
                return getGanIndex("庚");
            case "丁":
            case "壬":
                return getGanIndex("壬");
            case "戊":
            case "癸":
                return getGanIndex("甲");
            default:
                return -1; // 无效的年干
        }
    }

    // 查找天干索引位置
    private static int getGanIndex(String gan) {
        for (int i = 0; i < TIAN_GAN.length; i++) {
            if (TIAN_GAN[i].equals(gan)) {
                return i;
            }
        }
        return -1; // 未找到
    }

    // 测试示例
    public static void main(String[] args) {
        // 例如：甲年出生在农历三月
        String yearGan = "甲"; // 年干
        int lunarMonth = 2;    // 农历三月

        String monthPillar = calculateMonthPillar(yearGan, lunarMonth);
        System.out.println("月柱: " + monthPillar); // 输出: 戊辰
    }
}
